<?php

    /**
     * PHPExcel_Writer_Excel2007_Style
     * Copyright (c) 2006 - 2015 PHPExcel
     * This library is free software; you can redistribute it and/or
     * modify it under the terms of the GNU Lesser General Public
     * License as published by the Free Software Foundation; either
     * version 2.1 of the License, or (at your option) any later version.
     * This library is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     * Lesser General Public License for more details.
     * You should have received a copy of the GNU Lesser General Public
     * License along with this library; if not, write to the Free Software
     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
     * @category   PHPExcel
     * @package    PHPExcel_Writer_Excel2007
     * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
     * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL
     * @version    ##VERSION##, ##DATE##
     */
    class PHPExcel_Writer_Excel2007_Style extends PHPExcel_Writer_Excel2007_WriterPart {
        /**
         * Write styles to XML format
         * @param     PHPExcel $pPHPExcel
         * @return     string         XML Output
         * @throws     PHPExcel_Writer_Exception
         */
        public function writeStyles(PHPExcel $pPHPExcel = null) {
            // Create XML writer
            $objWriter = null;
            if ($this->getParentWriter()->getUseDiskCaching()) {
                $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
            } else {
                $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);
            }
            // XML header
            $objWriter->startDocument('1.0', 'UTF-8', 'yes');
            // styleSheet
            $objWriter->startElement('styleSheet');
            $objWriter->writeAttribute('xml:space', 'preserve');
            $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main');
            // numFmts
            $objWriter->startElement('numFmts');
            $objWriter->writeAttribute('count', $this->getParentWriter()->getNumFmtHashTable()->count());
            // numFmt
            for ($i = 0; $i < $this->getParentWriter()->getNumFmtHashTable()->count(); ++$i) {
                $this->writeNumFmt($objWriter, $this->getParentWriter()->getNumFmtHashTable()->getByIndex($i), $i);
            }
            $objWriter->endElement();
            // fonts
            $objWriter->startElement('fonts');
            $objWriter->writeAttribute('count', $this->getParentWriter()->getFontHashTable()->count());
            // font
            for ($i = 0; $i < $this->getParentWriter()->getFontHashTable()->count(); ++$i) {
                $this->writeFont($objWriter, $this->getParentWriter()->getFontHashTable()->getByIndex($i));
            }
            $objWriter->endElement();
            // fills
            $objWriter->startElement('fills');
            $objWriter->writeAttribute('count', $this->getParentWriter()->getFillHashTable()->count());
            // fill
            for ($i = 0; $i < $this->getParentWriter()->getFillHashTable()->count(); ++$i) {
                $this->writeFill($objWriter, $this->getParentWriter()->getFillHashTable()->getByIndex($i));
            }
            $objWriter->endElement();
            // borders
            $objWriter->startElement('borders');
            $objWriter->writeAttribute('count', $this->getParentWriter()->getBordersHashTable()->count());
            // border
            for ($i = 0; $i < $this->getParentWriter()->getBordersHashTable()->count(); ++$i) {
                $this->writeBorder($objWriter, $this->getParentWriter()->getBordersHashTable()->getByIndex($i));
            }
            $objWriter->endElement();
            // cellStyleXfs
            $objWriter->startElement('cellStyleXfs');
            $objWriter->writeAttribute('count', 1);
            // xf
            $objWriter->startElement('xf');
            $objWriter->writeAttribute('numFmtId', 0);
            $objWriter->writeAttribute('fontId', 0);
            $objWriter->writeAttribute('fillId', 0);
            $objWriter->writeAttribute('borderId', 0);
            $objWriter->endElement();
            $objWriter->endElement();
            // cellXfs
            $objWriter->startElement('cellXfs');
            $objWriter->writeAttribute('count', count($pPHPExcel->getCellXfCollection()));
            // xf
            foreach ($pPHPExcel->getCellXfCollection() as $cellXf) {
                $this->writeCellStyleXf($objWriter, $cellXf, $pPHPExcel);
            }
            $objWriter->endElement();
            // cellStyles
            $objWriter->startElement('cellStyles');
            $objWriter->writeAttribute('count', 1);
            // cellStyle
            $objWriter->startElement('cellStyle');
            $objWriter->writeAttribute('name', 'Normal');
            $objWriter->writeAttribute('xfId', 0);
            $objWriter->writeAttribute('builtinId', 0);
            $objWriter->endElement();
            $objWriter->endElement();
            // dxfs
            $objWriter->startElement('dxfs');
            $objWriter->writeAttribute('count', $this->getParentWriter()->getStylesConditionalHashTable()->count());
            // dxf
            for ($i = 0; $i < $this->getParentWriter()->getStylesConditionalHashTable()->count(); ++$i) {
                $this->writeCellStyleDxf($objWriter, $this->getParentWriter()->getStylesConditionalHashTable()->getByIndex($i)->getStyle());
            }
            $objWriter->endElement();
            // tableStyles
            $objWriter->startElement('tableStyles');
            $objWriter->writeAttribute('defaultTableStyle', 'TableStyleMedium9');
            $objWriter->writeAttribute('defaultPivotStyle', 'PivotTableStyle1');
            $objWriter->endElement();
            $objWriter->endElement();
            // Return
            return $objWriter->getData();
        }

        /**
         * Write NumberFormat
         * @param     PHPExcel_Shared_XMLWriter   $objWriter     XML Writer
         * @param     PHPExcel_Style_NumberFormat $pNumberFormat Number Format
         * @param     int                         $pId           Number Format identifier
         * @throws     PHPExcel_Writer_Exception
         */
        private function writeNumFmt(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style_NumberFormat $pNumberFormat = null, $pId = 0) {
            // Translate formatcode
            $formatCode = $pNumberFormat->getFormatCode();
            // numFmt
            if ($formatCode !== null) {
                $objWriter->startElement('numFmt');
                $objWriter->writeAttribute('numFmtId', ($pId + 164));
                $objWriter->writeAttribute('formatCode', $formatCode);
                $objWriter->endElement();
            }
        }

        /**
         * Write Font
         * @param     PHPExcel_Shared_XMLWriter $objWriter XML Writer
         * @param     PHPExcel_Style_Font       $pFont     Font style
         * @throws     PHPExcel_Writer_Exception
         */
        private function writeFont(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style_Font $pFont = null) {
            // font
            $objWriter->startElement('font');
            //    Weird! The order of these elements actually makes a difference when opening Excel2007
            //        files in Excel2003 with the compatibility pack. It's not documented behaviour,
            //        and makes for a real WTF!
            // Bold. We explicitly write this element also when false (like MS Office Excel 2007 does
            // for conditional formatting). Otherwise it will apparently not be picked up in conditional
            // formatting style dialog
            if ($pFont->getBold() !== null) {
                $objWriter->startElement('b');
                $objWriter->writeAttribute('val', $pFont->getBold() ? '1' : '0');
                $objWriter->endElement();
            }
            // Italic
            if ($pFont->getItalic() !== null) {
                $objWriter->startElement('i');
                $objWriter->writeAttribute('val', $pFont->getItalic() ? '1' : '0');
                $objWriter->endElement();
            }
            // Strikethrough
            if ($pFont->getStrikethrough() !== null) {
                $objWriter->startElement('strike');
                $objWriter->writeAttribute('val', $pFont->getStrikethrough() ? '1' : '0');
                $objWriter->endElement();
            }
            // Underline
            if ($pFont->getUnderline() !== null) {
                $objWriter->startElement('u');
                $objWriter->writeAttribute('val', $pFont->getUnderline());
                $objWriter->endElement();
            }
            // Superscript / subscript
            if ($pFont->getSuperScript() === true || $pFont->getSubScript() === true) {
                $objWriter->startElement('vertAlign');
                if ($pFont->getSuperScript() === true) {
                    $objWriter->writeAttribute('val', 'superscript');
                } elseif ($pFont->getSubScript() === true) {
                    $objWriter->writeAttribute('val', 'subscript');
                }
                $objWriter->endElement();
            }
            // Size
            if ($pFont->getSize() !== null) {
                $objWriter->startElement('sz');
                $objWriter->writeAttribute('val', $pFont->getSize());
                $objWriter->endElement();
            }
            // Foreground color
            if ($pFont->getColor()->getARGB() !== null) {
                $objWriter->startElement('color');
                $objWriter->writeAttribute('rgb', $pFont->getColor()->getARGB());
                $objWriter->endElement();
            }
            // Name
            if ($pFont->getName() !== null) {
                $objWriter->startElement('name');
                $objWriter->writeAttribute('val', $pFont->getName());
                $objWriter->endElement();
            }
            $objWriter->endElement();
        }

        /**
         * Write Fill
         * @param     PHPExcel_Shared_XMLWriter $objWriter XML Writer
         * @param     PHPExcel_Style_Fill       $pFill     Fill style
         * @throws     PHPExcel_Writer_Exception
         */
        private function writeFill(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style_Fill $pFill = null) {
            // Check if this is a pattern type or gradient type
            if ($pFill->getFillType() === PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR || $pFill->getFillType() === PHPExcel_Style_Fill::FILL_GRADIENT_PATH) {
                // Gradient fill
                $this->writeGradientFill($objWriter, $pFill);
            } elseif ($pFill->getFillType() !== null) {
                // Pattern fill
                $this->writePatternFill($objWriter, $pFill);
            }
        }

        /**
         * Write Gradient Fill
         * @param     PHPExcel_Shared_XMLWriter $objWriter XML Writer
         * @param     PHPExcel_Style_Fill       $pFill     Fill style
         * @throws     PHPExcel_Writer_Exception
         */
        private function writeGradientFill(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style_Fill $pFill = null) {
            // fill
            $objWriter->startElement('fill');
            // gradientFill
            $objWriter->startElement('gradientFill');
            $objWriter->writeAttribute('type', $pFill->getFillType());
            $objWriter->writeAttribute('degree', $pFill->getRotation());
            // stop
            $objWriter->startElement('stop');
            $objWriter->writeAttribute('position', '0');
            // color
            $objWriter->startElement('color');
            $objWriter->writeAttribute('rgb', $pFill->getStartColor()->getARGB());
            $objWriter->endElement();
            $objWriter->endElement();
            // stop
            $objWriter->startElement('stop');
            $objWriter->writeAttribute('position', '1');
            // color
            $objWriter->startElement('color');
            $objWriter->writeAttribute('rgb', $pFill->getEndColor()->getARGB());
            $objWriter->endElement();
            $objWriter->endElement();
            $objWriter->endElement();
            $objWriter->endElement();
        }

        /**
         * Write Pattern Fill
         * @param     PHPExcel_Shared_XMLWriter $objWriter XML Writer
         * @param     PHPExcel_Style_Fill       $pFill     Fill style
         * @throws     PHPExcel_Writer_Exception
         */
        private function writePatternFill(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style_Fill $pFill = null) {
            // fill
            $objWriter->startElement('fill');
            // patternFill
            $objWriter->startElement('patternFill');
            $objWriter->writeAttribute('patternType', $pFill->getFillType());
            if ($pFill->getFillType() !== PHPExcel_Style_Fill::FILL_NONE) {
                // fgColor
                if ($pFill->getStartColor()->getARGB()) {
                    $objWriter->startElement('fgColor');
                    $objWriter->writeAttribute('rgb', $pFill->getStartColor()->getARGB());
                    $objWriter->endElement();
                }
            }
            if ($pFill->getFillType() !== PHPExcel_Style_Fill::FILL_NONE) {
                // bgColor
                if ($pFill->getEndColor()->getARGB()) {
                    $objWriter->startElement('bgColor');
                    $objWriter->writeAttribute('rgb', $pFill->getEndColor()->getARGB());
                    $objWriter->endElement();
                }
            }
            $objWriter->endElement();
            $objWriter->endElement();
        }

        /**
         * Write Border
         * @param     PHPExcel_Shared_XMLWriter $objWriter XML Writer
         * @param     PHPExcel_Style_Borders    $pBorders  Borders style
         * @throws     PHPExcel_Writer_Exception
         */
        private function writeBorder(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style_Borders $pBorders = null) {
            // Write border
            $objWriter->startElement('border');
            // Diagonal?
            switch ($pBorders->getDiagonalDirection()) {
                case PHPExcel_Style_Borders::DIAGONAL_UP:
                    $objWriter->writeAttribute('diagonalUp', 'true');
                    $objWriter->writeAttribute('diagonalDown', 'false');
                    break;
                case PHPExcel_Style_Borders::DIAGONAL_DOWN:
                    $objWriter->writeAttribute('diagonalUp', 'false');
                    $objWriter->writeAttribute('diagonalDown', 'true');
                    break;
                case PHPExcel_Style_Borders::DIAGONAL_BOTH:
                    $objWriter->writeAttribute('diagonalUp', 'true');
                    $objWriter->writeAttribute('diagonalDown', 'true');
                    break;
            }
            // BorderPr
            $this->writeBorderPr($objWriter, 'left', $pBorders->getLeft());
            $this->writeBorderPr($objWriter, 'right', $pBorders->getRight());
            $this->writeBorderPr($objWriter, 'top', $pBorders->getTop());
            $this->writeBorderPr($objWriter, 'bottom', $pBorders->getBottom());
            $this->writeBorderPr($objWriter, 'diagonal', $pBorders->getDiagonal());
            $objWriter->endElement();
        }

        /**
         * Write BorderPr
         * @param     PHPExcel_Shared_XMLWriter $objWriter XML Writer
         * @param     string                    $pName     Element name
         * @param     PHPExcel_Style_Border     $pBorder   Border style
         * @throws     PHPExcel_Writer_Exception
         */
        private function writeBorderPr(PHPExcel_Shared_XMLWriter $objWriter = null, $pName = 'left', PHPExcel_Style_Border $pBorder = null) {
            // Write BorderPr
            if ($pBorder->getBorderStyle() != PHPExcel_Style_Border::BORDER_NONE) {
                $objWriter->startElement($pName);
                $objWriter->writeAttribute('style', $pBorder->getBorderStyle());
                // color
                $objWriter->startElement('color');
                $objWriter->writeAttribute('rgb', $pBorder->getColor()->getARGB());
                $objWriter->endElement();
                $objWriter->endElement();
            }
        }

        /**
         * Write Cell Style Xf
         * @param     PHPExcel_Shared_XMLWriter $objWriter XML Writer
         * @param     PHPExcel_Style            $pStyle    Style
         * @param     PHPExcel                  $pPHPExcel Workbook
         * @throws     PHPExcel_Writer_Exception
         */
        private function writeCellStyleXf(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style $pStyle = null, PHPExcel $pPHPExcel = null) {
            // xf
            $objWriter->startElement('xf');
            $objWriter->writeAttribute('xfId', 0);
            $objWriter->writeAttribute('fontId', (int)$this->getParentWriter()->getFontHashTable()->getIndexForHashCode($pStyle->getFont()->getHashCode()));
            if ($pStyle->getQuotePrefix()) {
                $objWriter->writeAttribute('quotePrefix', 1);
            }
            if ($pStyle->getNumberFormat()->getBuiltInFormatCode() === false) {
                $objWriter->writeAttribute('numFmtId', (int)($this->getParentWriter()->getNumFmtHashTable()->getIndexForHashCode($pStyle->getNumberFormat()->getHashCode()) + 164));
            } else {
                $objWriter->writeAttribute('numFmtId', (int)$pStyle->getNumberFormat()->getBuiltInFormatCode());
            }
            $objWriter->writeAttribute('fillId', (int)$this->getParentWriter()->getFillHashTable()->getIndexForHashCode($pStyle->getFill()->getHashCode()));
            $objWriter->writeAttribute('borderId', (int)$this->getParentWriter()->getBordersHashTable()->getIndexForHashCode($pStyle->getBorders()->getHashCode()));
            // Apply styles?
            $objWriter->writeAttribute('applyFont', ($pPHPExcel->getDefaultStyle()->getFont()->getHashCode() != $pStyle->getFont()->getHashCode()) ? '1' : '0');
            $objWriter->writeAttribute('applyNumberFormat', ($pPHPExcel->getDefaultStyle()->getNumberFormat()->getHashCode() != $pStyle->getNumberFormat()->getHashCode()) ? '1' : '0');
            $objWriter->writeAttribute('applyFill', ($pPHPExcel->getDefaultStyle()->getFill()->getHashCode() != $pStyle->getFill()->getHashCode()) ? '1' : '0');
            $objWriter->writeAttribute('applyBorder', ($pPHPExcel->getDefaultStyle()->getBorders()->getHashCode() != $pStyle->getBorders()->getHashCode()) ? '1' : '0');
            $objWriter->writeAttribute('applyAlignment', ($pPHPExcel->getDefaultStyle()->getAlignment()->getHashCode() != $pStyle->getAlignment()->getHashCode()) ? '1' : '0');
            if ($pStyle->getProtection()->getLocked() != PHPExcel_Style_Protection::PROTECTION_INHERIT || $pStyle->getProtection()->getHidden() != PHPExcel_Style_Protection::PROTECTION_INHERIT) {
                $objWriter->writeAttribute('applyProtection', 'true');
            }
            // alignment
            $objWriter->startElement('alignment');
            $objWriter->writeAttribute('horizontal', $pStyle->getAlignment()->getHorizontal());
            $objWriter->writeAttribute('vertical', $pStyle->getAlignment()->getVertical());
            $textRotation = 0;
            if ($pStyle->getAlignment()->getTextRotation() >= 0) {
                $textRotation = $pStyle->getAlignment()->getTextRotation();
            } elseif ($pStyle->getAlignment()->getTextRotation() < 0) {
                $textRotation = 90 - $pStyle->getAlignment()->getTextRotation();
            }
            $objWriter->writeAttribute('textRotation', $textRotation);
            $objWriter->writeAttribute('wrapText', ($pStyle->getAlignment()->getWrapText() ? 'true' : 'false'));
            $objWriter->writeAttribute('shrinkToFit', ($pStyle->getAlignment()->getShrinkToFit() ? 'true' : 'false'));
            if ($pStyle->getAlignment()->getIndent() > 0) {
                $objWriter->writeAttribute('indent', $pStyle->getAlignment()->getIndent());
            }
            if ($pStyle->getAlignment()->getReadorder() > 0) {
                $objWriter->writeAttribute('readingOrder', $pStyle->getAlignment()->getReadorder());
            }
            $objWriter->endElement();
            // protection
            if ($pStyle->getProtection()->getLocked() != PHPExcel_Style_Protection::PROTECTION_INHERIT || $pStyle->getProtection()->getHidden() != PHPExcel_Style_Protection::PROTECTION_INHERIT) {
                $objWriter->startElement('protection');
                if ($pStyle->getProtection()->getLocked() != PHPExcel_Style_Protection::PROTECTION_INHERIT) {
                    $objWriter->writeAttribute('locked', ($pStyle->getProtection()->getLocked() == PHPExcel_Style_Protection::PROTECTION_PROTECTED ? 'true' : 'false'));
                }
                if ($pStyle->getProtection()->getHidden() != PHPExcel_Style_Protection::PROTECTION_INHERIT) {
                    $objWriter->writeAttribute('hidden', ($pStyle->getProtection()->getHidden() == PHPExcel_Style_Protection::PROTECTION_PROTECTED ? 'true' : 'false'));
                }
                $objWriter->endElement();
            }
            $objWriter->endElement();
        }

        /**
         * Write Cell Style Dxf
         * @param     PHPExcel_Shared_XMLWriter $objWriter XML Writer
         * @param     PHPExcel_Style            $pStyle    Style
         * @throws     PHPExcel_Writer_Exception
         */
        private function writeCellStyleDxf(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style $pStyle = null) {
            // dxf
            $objWriter->startElement('dxf');
            // font
            $this->writeFont($objWriter, $pStyle->getFont());
            // numFmt
            $this->writeNumFmt($objWriter, $pStyle->getNumberFormat());
            // fill
            $this->writeFill($objWriter, $pStyle->getFill());
            // alignment
            $objWriter->startElement('alignment');
            if ($pStyle->getAlignment()->getHorizontal() !== null) {
                $objWriter->writeAttribute('horizontal', $pStyle->getAlignment()->getHorizontal());
            }
            if ($pStyle->getAlignment()->getVertical() !== null) {
                $objWriter->writeAttribute('vertical', $pStyle->getAlignment()->getVertical());
            }
            if ($pStyle->getAlignment()->getTextRotation() !== null) {
                $textRotation = 0;
                if ($pStyle->getAlignment()->getTextRotation() >= 0) {
                    $textRotation = $pStyle->getAlignment()->getTextRotation();
                } elseif ($pStyle->getAlignment()->getTextRotation() < 0) {
                    $textRotation = 90 - $pStyle->getAlignment()->getTextRotation();
                }
                $objWriter->writeAttribute('textRotation', $textRotation);
            }
            $objWriter->endElement();
            // border
            $this->writeBorder($objWriter, $pStyle->getBorders());
            // protection
            if (($pStyle->getProtection()->getLocked() !== null) || ($pStyle->getProtection()->getHidden() !== null)) {
                if ($pStyle->getProtection()->getLocked() !== PHPExcel_Style_Protection::PROTECTION_INHERIT || $pStyle->getProtection()
                                                                                                                      ->getHidden() !== PHPExcel_Style_Protection::PROTECTION_INHERIT
                ) {
                    $objWriter->startElement('protection');
                    if (($pStyle->getProtection()->getLocked() !== null) && ($pStyle->getProtection()->getLocked() !== PHPExcel_Style_Protection::PROTECTION_INHERIT)) {
                        $objWriter->writeAttribute('locked', ($pStyle->getProtection()->getLocked() == PHPExcel_Style_Protection::PROTECTION_PROTECTED ? 'true' : 'false'));
                    }
                    if (($pStyle->getProtection()->getHidden() !== null) && ($pStyle->getProtection()->getHidden() !== PHPExcel_Style_Protection::PROTECTION_INHERIT)) {
                        $objWriter->writeAttribute('hidden', ($pStyle->getProtection()->getHidden() == PHPExcel_Style_Protection::PROTECTION_PROTECTED ? 'true' : 'false'));
                    }
                    $objWriter->endElement();
                }
            }
            $objWriter->endElement();
        }

        /**
         * Get an array of all conditional styles
         * @param     PHPExcel $pPHPExcel
         * @return     PHPExcel_Style_Conditional[]        All conditional styles in PHPExcel
         * @throws     PHPExcel_Writer_Exception
         */
        public function allConditionalStyles(PHPExcel $pPHPExcel = null) {
            // Get an array of all styles
            $aStyles = [];
            $sheetCount = $pPHPExcel->getSheetCount();
            for ($i = 0; $i < $sheetCount; ++$i) {
                foreach ($pPHPExcel->getSheet($i)->getConditionalStylesCollection() as $conditionalStyles) {
                    foreach ($conditionalStyles as $conditionalStyle) {
                        $aStyles[] = $conditionalStyle;
                    }
                }
            }
            return $aStyles;
        }

        /**
         * Get an array of all fills
         * @param     PHPExcel $pPHPExcel
         * @return     PHPExcel_Style_Fill[]        All fills in PHPExcel
         * @throws     PHPExcel_Writer_Exception
         */
        public function allFills(PHPExcel $pPHPExcel = null) {
            // Get an array of unique fills
            $aFills = [];
            // Two first fills are predefined
            $fill0 = new PHPExcel_Style_Fill();
            $fill0->setFillType(PHPExcel_Style_Fill::FILL_NONE);
            $aFills[] = $fill0;
            $fill1 = new PHPExcel_Style_Fill();
            $fill1->setFillType(PHPExcel_Style_Fill::FILL_PATTERN_GRAY125);
            $aFills[] = $fill1;
            // The remaining fills
            $aStyles = $this->allStyles($pPHPExcel);
            foreach ($aStyles as $style) {
                if (!array_key_exists($style->getFill()->getHashCode(), $aFills)) {
                    $aFills[$style->getFill()->getHashCode()] = $style->getFill();
                }
            }
            return $aFills;
        }

        /**
         * Get an array of all styles
         * @param     PHPExcel $pPHPExcel
         * @return     PHPExcel_Style[]        All styles in PHPExcel
         * @throws     PHPExcel_Writer_Exception
         */
        public function allStyles(PHPExcel $pPHPExcel = null) {
            return $pPHPExcel->getCellXfCollection();
        }

        /**
         * Get an array of all fonts
         * @param     PHPExcel $pPHPExcel
         * @return     PHPExcel_Style_Font[]        All fonts in PHPExcel
         * @throws     PHPExcel_Writer_Exception
         */
        public function allFonts(PHPExcel $pPHPExcel = null) {
            // Get an array of unique fonts
            $aFonts  = [];
            $aStyles = $this->allStyles($pPHPExcel);
            foreach ($aStyles as $style) {
                if (!array_key_exists($style->getFont()->getHashCode(), $aFonts)) {
                    $aFonts[$style->getFont()->getHashCode()] = $style->getFont();
                }
            }
            return $aFonts;
        }

        /**
         * Get an array of all borders
         * @param     PHPExcel $pPHPExcel
         * @return     PHPExcel_Style_Borders[]        All borders in PHPExcel
         * @throws     PHPExcel_Writer_Exception
         */
        public function allBorders(PHPExcel $pPHPExcel = null) {
            // Get an array of unique borders
            $aBorders = [];
            $aStyles  = $this->allStyles($pPHPExcel);
            foreach ($aStyles as $style) {
                if (!array_key_exists($style->getBorders()->getHashCode(), $aBorders)) {
                    $aBorders[$style->getBorders()->getHashCode()] = $style->getBorders();
                }
            }
            return $aBorders;
        }

        /**
         * Get an array of all number formats
         * @param     PHPExcel $pPHPExcel
         * @return     PHPExcel_Style_NumberFormat[]        All number formats in PHPExcel
         * @throws     PHPExcel_Writer_Exception
         */
        public function allNumberFormats(PHPExcel $pPHPExcel = null) {
            // Get an array of unique number formats
            $aNumFmts = [];
            $aStyles  = $this->allStyles($pPHPExcel);
            foreach ($aStyles as $style) {
                if ($style->getNumberFormat()->getBuiltInFormatCode() === false && !array_key_exists($style->getNumberFormat()->getHashCode(), $aNumFmts)) {
                    $aNumFmts[$style->getNumberFormat()->getHashCode()] = $style->getNumberFormat();
                }
            }
            return $aNumFmts;
        }
    }
